# -*- coding: utf-8 -*-

# Copyright (c) 2025 Lijiang
# Licensed under the MIT License
# See LICENSE file for details

"""
力江视频压缩工具配置文件
集中管理应用程序的所有配置信息
"""

############################### 应用程序基本信息 ###############################

# 应用程序名称和版本
APP_NAME = "力江视频压缩工具"
APP_NAME_EN = "Lijiang Video Compression Tool"
APP_NAME_EXE = "LijiangVideoCompressionTool"  # 用于exe文件名，不包含空格
APP_VERSION = "1.0.0"
APP_PUBLISHER = "Lijiang"
APP_ORGANIZATION = "VideoCompression"

# 应用程序描述
APP_DESCRIPTION = "一个基于 PyQt6 和 FFmpeg 开发的现代化视频压缩工具，采用深色主题设计，支持批量视频压缩。"

############################### 窗口配置 ###############################

# 主窗口配置
WINDOW_CONFIG = {
    "title": APP_NAME,
    "min_width": 1000,
    "min_height": 700,
    "default_width": 1200,
    "default_height": 800,
    "icon": "icon.ico"
}

############################### 文件配置 ###############################

# 支持的视频格式
SUPPORTED_VIDEO_FORMATS = {
    '.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.webm', '.m4v'
}

# 文件过滤器（用于文件对话框）
VIDEO_FILE_FILTER = "视频文件 (*.mp4 *.avi *.mov *.mkv *.wmv *.flv *.webm *.m4v);;所有文件 (*)"

# 文件大小限制
MAX_FILE_SIZE_GB = 10  # 最大文件大小（GB）
MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_GB * 1024 * 1024 * 1024

############################### 压缩配置 ###############################

# 压缩比例范围
COMPRESSION_CONFIG = {
    "min_ratio": 0,      # 最小压缩比例（0%）
    "max_ratio": 90,     # 最大压缩比例（90%）
    "default_ratio": 0,  # 默认压缩比例
    "tick_interval": 10  # 滑块刻度间隔
}

# FFmpeg配置
FFMPEG_CONFIG = {
    "video_codec": "libx264",
    "audio_codec": "aac",
    "preset": "medium",
    "crf": "23",
    "audio_bitrate": "128k"
}

# 线程池配置
THREAD_POOL_CONFIG = {
    "max_workers": 5,  # 最大并发工作线程数
    "progress_update_interval": 100  # 进度更新间隔（毫秒）
}

############################### UI配置 ###############################

# 主题配置
THEME_CONFIG = {
    "name": "dark",
    "style_file": "ui/styles.py"
}

# 进度条配置
PROGRESS_CONFIG = {
    "min_value": 0,
    "max_value": 100,
    "default_value": 0
}

# 表格配置
TABLE_CONFIG = {
    "row_height": 40,
    "alternating_colors": True,
    "selection_mode": "extended",  # 支持多选
    "sorting_enabled": True
}

############################### 构建配置 ###############################

# 构建输出配置
BUILD_CONFIG = {
    "executable_name": f"{APP_NAME_EN.replace(' ', '_')}.exe",
    "installer_name": f"{APP_NAME_EN.replace(' ', '_')}_Setup_v{APP_VERSION}.exe",
    "dist_dir": "dist",
    "build_dir": "build"
}

# PyInstaller配置
PYINSTALLER_CONFIG = {
    "spec_file": "video_compression.spec",
    "console": False,  # 不显示控制台窗口
    "upx": True,       # 使用UPX压缩
    "icon": "icon.ico"
}

# NSIS安装程序配置
NSIS_CONFIG = {
    "script_file": "installer.nsi",
    "install_dir": "$PROGRAMFILES\\Lijiang\\视频压缩工具",
    "registry_key": "Software\\Lijiang\\视频压缩工具",
    "uninstall_key": "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\力江视频压缩工具"
}

############################### 日志配置 ###############################

# 日志配置
LOG_CONFIG = {
    "level": "DEBUG",
    "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    "file": "video_compression.log",
    "encoding": "utf-8",
    "max_size_mb": 10,  # 最大日志文件大小（MB）
    "backup_count": 5   # 保留的日志文件数量
}

############################### 网络配置 ###############################

# 下载配置
DOWNLOAD_CONFIG = {
    "installer_url": "https://lijiang-jianying.oss-cn-beijing.aliyuncs.com/static/Lijiang_Video_Compression_Tool_Setup.exe",
    "timeout": 30  # 下载超时时间（秒）
}

############################### 系统配置 ###############################

# 系统要求
SYSTEM_REQUIREMENTS = {
    "min_python_version": "3.8",
    "recommended_python_version": "3.11",
    "min_disk_space_gb": 2,
    "supported_os": ["Windows 10", "Windows 11"]
}

############################### 开发配置 ###############################

# 开发依赖
DEV_DEPENDENCIES = [
    "PyQt6>=6.4.0",
    "pyinstaller>=5.0"
]

# 代码规范
CODE_STYLE = {
    "encoding": "utf-8",
    "line_length": 120,
    "docstring_style": "google"
}

############################### 错误消息配置 ###############################

# 错误消息
ERROR_MESSAGES = {
    "file_not_found": "文件不存在",
    "unsupported_format": "不支持的视频格式",
    "file_too_large": f"文件过大（超过{MAX_FILE_SIZE_GB}GB）",
    "file_empty": "文件为空",
    "ffmpeg_not_found": "未找到FFmpeg可执行文件",
    "compression_failed": "压缩失败",
    "disk_space_insufficient": "磁盘空间不足",
    "invalid_file": "文件验证失败"
}

# 成功消息
SUCCESS_MESSAGES = {
    "compression_complete": "压缩完成",
    "file_added": "文件添加成功",
    "files_cleared": "文件列表已清空",
    "task_cancelled": "任务已取消"
}

############################### 工具函数 ###############################

def get_app_info():
    """获取应用程序信息"""
    return {
        "name": APP_NAME_EXE,  # 用于exe文件名，不包含空格
        "name_zh": APP_NAME,  # 中文名称
        "name_en": APP_NAME_EN,  # 英文显示名称
        "version": APP_VERSION,
        "publisher": APP_PUBLISHER,
        "organization": APP_ORGANIZATION,
        "description": APP_DESCRIPTION
    }

def get_window_config():
    """获取窗口配置"""
    return WINDOW_CONFIG.copy()

def get_compression_config():
    """获取压缩配置"""
    return COMPRESSION_CONFIG.copy()

def get_ffmpeg_config():
    """获取FFmpeg配置"""
    return FFMPEG_CONFIG.copy()

def get_build_config():
    """获取构建配置"""
    return BUILD_CONFIG.copy()

def get_pyinstaller_config():
    """获取PyInstaller配置"""
    return PYINSTALLER_CONFIG.copy()

def get_nsis_config():
    """获取NSIS配置"""
    return NSIS_CONFIG.copy()

def get_log_config():
    """获取日志配置"""
    return LOG_CONFIG.copy()

def get_error_message(key, default=None):
    """获取错误消息"""
    return ERROR_MESSAGES.get(key, default or f"未知错误: {key}")

def get_success_message(key, default=None):
    """获取成功消息"""
    return SUCCESS_MESSAGES.get(key, default or f"操作成功: {key}")

############################### 配置验证 ###############################

def validate_config():
    """验证配置的有效性"""
    errors = []
    
    # 验证版本号格式
    if not APP_VERSION or not isinstance(APP_VERSION, str):
        errors.append("APP_VERSION 必须是非空字符串")
    
    # 验证窗口尺寸
    if WINDOW_CONFIG["min_width"] <= 0 or WINDOW_CONFIG["min_height"] <= 0:
        errors.append("窗口最小尺寸必须大于0")
    
    if WINDOW_CONFIG["default_width"] < WINDOW_CONFIG["min_width"]:
        errors.append("默认宽度不能小于最小宽度")
    
    if WINDOW_CONFIG["default_height"] < WINDOW_CONFIG["min_height"]:
        errors.append("默认高度不能小于最小高度")
    
    # 验证压缩比例
    if not (0 <= COMPRESSION_CONFIG["min_ratio"] <= 100):
        errors.append("最小压缩比例必须在0-100之间")
    
    if not (0 <= COMPRESSION_CONFIG["max_ratio"] <= 100):
        errors.append("最大压缩比例必须在0-100之间")
    
    if COMPRESSION_CONFIG["min_ratio"] >= COMPRESSION_CONFIG["max_ratio"]:
        errors.append("最小压缩比例必须小于最大压缩比例")
    
    # 验证线程池配置
    if THREAD_POOL_CONFIG["max_workers"] <= 0:
        errors.append("最大工作线程数必须大于0")
    
    if errors:
        raise ValueError(f"配置验证失败: {'; '.join(errors)}")
    
    return True

# 在模块加载时验证配置
if __name__ != "__main__":
    try:
        validate_config()
    except ValueError as e:
        print(f"警告: {e}")
